// 1309. 解码字母到整数映射
//给你一个字符串 s，它由数字（'0' - '9'）和 '#' 组成。我们希望按下述规则将 s 映射为一些小写英文字符：
//
//字符（'a' - 'i'）分别用（'1' - '9'）表示。
//字符（'j' - 'z'）分别用（'10#' - '26#'）表示。
//返回映射之后形成的新字符串。
//
//题目数据保证映射始终唯一。
//
//来源：力扣（LeetCode）
//链接：https://leetcode-cn.com/problems/decrypt-string-from-alphabet-to-integer-mapping

package decrypt_string_from_alphabet_to_integer_mapping

import (
	"strconv"
	"strings"
)

// intoAlphabet 转化数字到字母
func intoAlphabet(item string) string {

	// 其他情况先判断，直接返回
	if len(item) == 0 {
		return ""
	}

	char, _ := strconv.Atoi(item)

	// ascii 码中 a = 97
	// 1 -> 97 则 +96
	return string(rune(char + 96))
}

// loopIntoAlphabet 逐个转化数字到字母
func loopIntoAlphabet(item string) (res string) {

	for _, char := range item {
		res += intoAlphabet(string(char))
	}
	return
}

func freqAlphabets(s string) (res string) {

	groups := strings.SplitAfter(s, "#")

	for _, item := range groups {

		length := len(item)

		// 空字符串则跳过
		if length == 0 {
			continue
		}

		// 小于 3 位字符串映射，直接解析
		if length < 3 {
			res += loopIntoAlphabet(item)
			continue
		}

		// 3 位字符串映射，返回一位字符
		if length == 3 {
			res += intoAlphabet(item[:length-1])
			continue
		}

		res += loopIntoAlphabet(item[:length-3])
		res += intoAlphabet(item[length-3 : length-1])
	}

	return
}
